package org.deephacks.confit.internal.core.cdi; import org.deephacks.confit.ConfigContext; import org.deephacks.confit.ConfigScope; import javax.enterprise.context.spi.Context; import javax.enterprise.context.spi.Contextual; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.CDI; import javax.inject.Singleton; import java.lang.annotation.Annotation; import java.util.concurrent.ConcurrentHashMap; @Singleton @SuppressWarnings(value = { "unchecked", "rawtypes" }) public class ConfigCdiContext implements Context { private ConfigContext ctx; private CreationalContext cctx = null; private static final ConcurrentHashMap<Class<?>, Object> cache = new ConcurrentHashMap<>(); public ConfigCdiContext() { } @Override public Class<? extends Annotation> getScope() { return ConfigScope.class; } @Override public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) { Bean<T> bean = (Bean<T>) contextual; cctx = creationalContext; if (ctx == null) { ctx = CDI.current().select(ConfigContext.class).get(); } final Object object; if (cache.containsKey(bean.getBeanClass())) { object = cache.get(bean.getBeanClass()); } else { object = ctx.get(bean.getBeanClass()); cache.put(bean.getBeanClass(), object); } return (T) object; } @Override public <T> T get(Contextual<T> contextual) { if (cctx == null) { return null; } if (ctx == null) { ctx = CDI.current().select(ConfigContext.class).get(); } Bean<T> bean = (Bean<T>) contextual; final Object object; if (cache.containsKey(bean.getBeanClass())) { object = cache.get(bean.getBeanClass()); } else { object = ctx.get(bean.getBeanClass()); cache.put(bean.getBeanClass(), object); } return (T) object; } @Override public boolean isActive() { return true; } }